STAAD.Pro Help

OS. C++でのOpenSTAADプログラムの記述

この例では、C++でOpenSTAADアプリケーションを記述するために必要ないくつかの概念を紹介します。

Visual Studio 2019のC++プロジェクトの例は、こちらからダウンロードできます。

ヒント: 前の"Hello World!"の例に従った場合は、その行を削除するだけで、その時点から開始することができます。

OS. C++でのOpenSTAADの開始

注記: この例では、STAAD.Proでモデルを開いておく必要があります。そうしないと、コードからエラーが返されます。
  1. マニフェストファイルを作成してC++プロジェクトに追加します。
    1. 新しいファイルを作成し、ファイル拡張子を.manifestにして任意の場所に保存します。
    2. Visual Studio内からプロジェクトを右クリックし、ポップアップメニューから「追加」 > 「既存の項目」の順に選択します。
    3. マニフェストファイルを参照して選択します。
    4. マニフェストファイルを開き、次の内容を追加します。
      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
      	<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
      		<security>
      			<requestedPrivileges>
      				<requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
      			</requestedPrivileges>
      		</security>
      	</trustInfo>
      	<comInterfaceExternalProxyStub name="IOSMemberSteelDgnParams" iid="{F40BDCDA-B3DE-495C-B84F-790F4456137F}" tlbid="{EDA9FA7F-EFC9-4264-9513-39CF6E72604D}" proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub>
      	<comInterfaceExternalProxyStub name="IOpenSTAADUI" iid="{3F5B8055-31C6-446E-8BED-FEE43E09D4CC}" tlbid="{EDA9FA7F-EFC9-4264-9513-39CF6E72604D}" proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub>
      	<comInterfaceExternalProxyStub name="IOSGeometryUI" iid="{C052FED9-A2D6-42E3-A271-2C6FB8461711}" tlbid="{EDA9FA7F-EFC9-4264-9513-39CF6E72604D}" proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub>
      	<comInterfaceExternalProxyStub name="IStaadProWindow" iid="{9EF2FF8C-E574-4A04-9462-2E4500C8EADB}" tlbid="{EDA9FA7F-EFC9-4264-9513-39CF6E72604D}" proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub>
      	<comInterfaceExternalProxyStub name="IOSViewUI" iid="{87B1975B-6031-487E-A0F9-FB8F69FA24E6}" tlbid="{EDA9FA7F-EFC9-4264-9513-39CF6E72604D}" proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub>
      	<comInterfaceExternalProxyStub name="IOSOutputUI" iid="{824F1FC0-DC86-4CC4-A4C6-83C77D7B0496}" tlbid="{EDA9FA7F-EFC9-4264-9513-39CF6E72604D}" proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub>
      	<comInterfaceExternalProxyStub name="IOSPropertyUI" iid="{F919EF7D-E1DD-48CB-B3C3-B3CAE9E3B5AB}" tlbid="{EDA9FA7F-EFC9-4264-9513-39CF6E72604D}" proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub>
      	<comInterfaceExternalProxyStub name="IOSLoadUI" iid="{DAA37D16-821F-4137-88EB-DA4EB7650E90}" tlbid="{EDA9FA7F-EFC9-4264-9513-39CF6E72604D}" proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub>
      	<comInterfaceExternalProxyStub name="IOSTableUI" iid="{CF1A7B89-A007-4844-A098-CBABAEBEF304}" tlbid="{EDA9FA7F-EFC9-4264-9513-39CF6E72604D}" proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub>
      	<comInterfaceExternalProxyStub name="IOSSupportUI" iid="{B076EC62-9A33-4E1C-B38C-3E45090B8531}" tlbid="{EDA9FA7F-EFC9-4264-9513-39CF6E72604D}" proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub>
      	<comInterfaceExternalProxyStub name="IOSCommandsUI" iid="{6B994A7C-122C-4828-B42B-1B0CADF91F9D}" tlbid="{EDA9FA7F-EFC9-4264-9513-39CF6E72604D}" proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub>
      	<comInterfaceExternalProxyStub name="IOSDesignUI" iid="{ED218322-40EE-411C-8552-209DB2C4F32B}" tlbid="{EDA9FA7F-EFC9-4264-9513-39CF6E72604D}" proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub>
      </assembly>
  2. #import " C:\Program Files\Bentley\Engineering\STAAD.Pro 2023\ STAAD\StaadPro.dll" named_guids」と入力してStaadPro.dllをインポートし、<Enter>キーを押します。
  3. namespace OSApp = OpenSTAADUI;」と入力して名前空間を設定し、<Enter>キーを押します。 この名前空間には、COM相互運用とプラットフォーム呼び出しのサービスをサポートするさまざまなメンバーが用意されています。
  4. int main()の内側にカーソルを置きます。
  5. 次の行を追加します。
    OSApp::IOpenSTAADUIPtr OSAppPtr;
    CoInitialize(NULL);
    HRESULT hr = OSAppPtr.CreateInstance(__uuidof(OSApp::OpenSTAAD));
    if (hr != S_OK)
    	{
    	printf("Unable to connect to STAAD.Pro application!\n");
    	return 1;
    	}
    
    hr = OSAppPtr.GetActiveObject(__uuidof(OSApp::OpenSTAAD));
    これにより、OpenSTAADが開始され、プログラムの現在のSTAAD.Proモデルに接続されます。

    CreateInstanceは初期化されていないオブジェクトを作成し、GetActiveObjectはOLEに登録されている実行中のオブジェクトへのポインタを取得します。

この時点で、プログラムは次のようになります。
#import " C:\Program Files\Bentley\Engineering\STAAD.Pro 2023\ STAAD\StaadPro.dll" named_guids
using namespace OpenSTAADUI;
using namespace std;
namespace OSApp = OpenSTAADUI; 
 
 int main()
{
 OSApp::IOpenSTAADUIPtr OSAppPtr;
 try
 {
 CoInitialize(NULL);
 HRESULT hr = OSAppPtr.CreateInstance(__uuidof(OSApp::OpenSTAAD));

 if (hr != S_OK)
 {
 printf("Unable to connect to STAAD.Pro application!\n");
 return 1;
 }

 hr = OSAppPtr.GetActiveObject(__uuidof(OSApp::OpenSTAAD));
 if (hr != S_OK)
 {
 printf("Unable to connect to an active instance of STAAD.Pro application!\n");
 return 1;
 }
}
catch (_com_error& e)
 {
 _bstr_t bstrDescription = e.Description();
 printf("COM Error! %s\n", bstrDescription);
 }
}

OS. Geometryメソッドの使用

  1. main()の先頭にある「OSApp::IOpenSTAADUIPtr OSAppPtr;」の後の新しい行に「OSApp::IOSGeometryUIPtr OSGeomPtr;」と入力し、<Enter>キーを押します。
  2. main()の終了を示す右中括弧("}")のすぐ内側にカーソルを置き、<Enter>キーを押します。
  3. OSGeomPtr = OSAppPtr->GetGeometry();」と入力し、<Enter>キーを押します。

    これにより、ジオメトリ変数がOpenSTAADのGeometryグループのメソッドとして定義されます。

  4. int nNodes = OSGeomPtr->GetNodeCount();」と入力し、<Enter>キーを押します。

    これにより、OpenSTAADメソッドGetNodeCount()を使用して、アクティブなSTAAD.Proモデル内のノードの数が指定した変数に返されるようになります。

  5. int nMembers = OSGeomPtr->GetMemberCount();」と入力し、<Enter>キーを押します。

    同様に、OpenSTAADメソッドGetMemberCount()を使用して、アクティブなSTAAD.Proモデル内のメンバーの数が指定した変数に返されるようになります。

    ヒント: 使用可能なメソッドの詳細、およびそれぞれで入力として受け入れられる値と返される値については、OpenSTAADのドキュメントを参照してください。
この時点で、プログラムは次のようになります。
#include "pch.h"
#include <iostream>
#import "C:\Program Files\Bentley\Engineering\STAAD.Pro 2023\STAAD\StaadPro.dll" named_guids 

using namespace OpenSTAADUI;
using namespace std;

namespace OSApp = OpenSTAADUI;
int main()
    {
    OSApp::IOpenSTAADUIPtr OSAppPtr;
    OSApp::IOSGeometryUIPtr OSGeomPtr;

    try
     {
 CoInitialize(NULL);	
        HRESULT hr = OSAppPtr.CreateInstance(__uuidof(OSApp::OpenSTAAD));

        if (hr != S_OK)
            {
            printf("Unable to connect to STAAD.Pro application!\n");
            return 1;
            }

        hr = OSAppPtr.GetActiveObject(__uuidof(OSApp::OpenSTAAD));
        if (hr != S_OK)
            {
            printf("Unable to connect to an active instance of STAAD.Pro application!\n");
            return 1;
            }

        OSGeomPtr = OSAppPtr->GetGeometry();

        int nNodes = OSGeomPtr->GetNodeCount();
        int nMembers = OSGeomPtr->GetMemberCount();
        }
    catch (_com_error& e)
        {
        _bstr_t bstrDescription = e.Description();
        printf("COM Error! %s\n", bstrDescription);
        }
    }

OS. OpenSTAAD出力の生成

  1. printf("No. of Nodes: %d\n", nNodes);」と入力し、<Enter>キーを押します。

    ここでは、printfを使用して、フォーマットされたデータを標準出力に出力しています。ノードの数が読み取り可能な形式でコンソールに出力されます。

  2. printf("No. of Members: %d\n", nMembers);」と入力します。

    同様に、ここでは、文字列に変換されたbeamCountの値をテキストと連結し、その結果を端末に表示しています。

最終的なプログラムは次のようになります。
#include "pch.h"
#include <iostream>
#import " C:\Program Files\Bentley\Engineering\STAAD.Pro 2023\ STAAD\StaadPro.dll" named_guids 

using namespace OpenSTAADUI;
using namespace std;

namespace OSApp = OpenSTAADUI;
int main()
 {
 OSApp::IOpenSTAADUIPtr OSAppPtr;
 OSApp::IOSGeometryUIPtr OSGeomPtr;

 try
 {
 CoInitialize(NULL); 
 HRESULT hr = OSAppPtr.CreateInstance(__uuidof(OSApp::OpenSTAAD));

 if (hr != S_OK)
 {
 printf("Unable to connect to STAAD.Pro application!\n");
 return 1;
 }

 hr = OSAppPtr.GetActiveObject(__uuidof(OSApp::OpenSTAAD));
 if (hr != S_OK)
 {
 printf("Unable to connect to an active instance of STAAD.Pro application!\n");
 return 1;
 }

 OSGeomPtr = OSAppPtr->GetGeometry();

 int nNodes = OSGeomPtr->GetNodeCount();
 int nMembers = OSGeomPtr->GetMemberCount();
 printf("No. of Nodes: %d\n", nNodes);
 printf("No. of Members: %d\n", nMembers);
 }
 catch (_com_error& e)
 {
 _bstr_t bstrDescription = e.Description();
 printf("COM Error! %s\n", bstrDescription);
 }
 }

OS. コードの実行

これまでの作業で、現在アクティブなSTAAD.Proモデルに関する情報を提供するC++コードの準備ができました。次に、このコードを実行してテストします。

  1. 次のどちらかの方法で、これまでの作業を保存します。

    「ファイル」 > 「保存」の順に選択する

    または

    <Ctrl+S>キーを押す

  2. <Ctrl+F5>キーを押してプロジェクトを実行します。 ターミナルが開き、結果が表示されます。

コメントを使用してコードに注釈を付けることをお勧めします。これにより、コードによる処理内容(あるいは少なくともその意図)を他のユーザーが理解しやすくなります。この完全な例には、該当するコメントが含まれています。

Microsoft Visual Studio 2019でC++の例を実行